package com.zhangwoo.util;
 
import java.util.ArrayList;
import java.util.List;
 
public class InfoDetails {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
//    	String x=mainProc(new String[]{ "散热" },JavaUtil.readFile("d:\\TestZone\\a01_2012081517\\7.txt"));
//        System.out.println(x);
//        System.out.println(Alarm.isAlerm("电池 or CPU or 内存 or 操控 or 功能 or 操作系统 or 散热 or 声音 or 信号 or 屏幕 or 外观 or 价格 or 配件 or 售后维修服务 or 其它", x));
    	String m="##a01_20120814053100~i9100 and i9300 and 三星#a01_20120815023059~三星 and (i9100 or I9100)#a01_20120815023059_p~电池 or CPU or 内存 or 操控 or 功能 or 操作系统 or 散热 or 声音 or 信号 or 屏幕 or 外观 or 价格 or 配件 or 售后维修服务 or 其它";
    	m=m.replaceAll("#[^~]+~", "\\~\\$\\~")
		// 所有关键词拼接
		.replace("and", "~$~").replace("or", "~$~").replace("not", "~$~")
		.replace("#", "~$~").replace("(", "~$~").replace(")", "~$~")
		.replace(",", "~$~");
    	
    	String[] terms = m.split("\\~\\$\\~");
    	
    	for(String k:terms)
    		System.out.println(k.trim());
    }
    
    private static boolean isRemoveable(String matchHtml){
    	
    	if(matchHtml.indexOf(">", 200) < matchHtml.indexOf("<", 200))// 在标签中
    		return true;
    	
    	if(matchHtml.indexOf("<", 200) == matchHtml.indexOf("</a>", 200))// 紧跟着在 A 标签中
    		return true;
    	
    	if(matchHtml.indexOf("</a>", 200) >0 && matchHtml.indexOf("<a", 200) == -1)// 在 A 标签中但是中间有其他标签
    		return true;
    	
    	if(matchHtml.indexOf("</a>", 200) >0 && matchHtml.indexOf("<a", 200) > matchHtml.indexOf("</a>", 200))// 在 A 标签中，并且末尾又出现一个A标签的开始
    		return true;
    	
    	if(matchHtml.replaceAll("<[^>]*?>", "").length() < 50) // 去除标签后小于50字
    		return true;
    	
    	return false;
    	
    }
 
    public static String mainProc(String[] keys,String htmls) {
        htmls = htmls
                .replaceAll("\\s", "")
                .replaceAll("<[hH][eE][aA][dD].*?</[hH][eE][aA][dD]>", "")
                .replaceAll("<[sS][tT][yY][lL][eE].*?</[sS][tT][yY][lL][eE]>",
                        "")
                .replaceAll(
                        "<[sS][cC][rR][iI][Pp][Tt].*?</[sS][cC][rR][iI][Pp][Tt]>",
                        "").replaceAll("&nbsp;", "") // 去除web空格
                .replaceAll("<!--.*?-->", "");
//        System.out.println(htmls);
 
        List<String> blocks = new ArrayList<String>();// 截取信息块
        List<String> blocks_tmp = new ArrayList<String>();// 临时中转用于合并截取信息块
 
        List<Integer[]> blocks_pos = new ArrayList<Integer[]>(); // 不同关键词的位置起始数字，顺序排列，应当和
                                                                    // blocks
                                                                    // 相对应
 
        int htmlLen = htmls.length();
 
        for (String key : keys) {
        	
        	if(key.trim().length()==0) continue;
 
            // 1.获取所有匹配
            int i = 200;
            while (i > 0) {
                i = htmls.indexOf(key, i) + 1; // 获取当前关键字的匹配位置
                if (i <= 0)
                    break; // 完成了当前关键词的搜索
                
                // 若不合标准 ，则不加入队列
                if(isRemoveable(htmls.substring((i - 200),
                                (i + 200) > htmlLen ? htmlLen : (i + 200))))
                	continue;
 
                for (int p_index = 0; p_index < blocks_pos.size(); p_index++) {
                    Integer[] be = blocks_pos.get(p_index);
 
                    if ((be[0] < (i - 200) && (i - 200) < be[1])) {// 若当前匹配位置左边界小于当前右边界大于左边界
                        blocks_pos.set(p_index, new Integer[] { be[0],
                                (i + 200) > htmlLen ? htmlLen : (i + 200) });// 需要扩展右边界
                        blocks.set(p_index, htmls.substring(be[0],
                                (i + 200) > htmlLen ? htmlLen : (i + 200)));// 内容扩展右边界
                        break;
                    } else if ((be[0] < (i + 200) && (i + 200) < be[1])) {// 若匹配位置右边界小于当前右边界大于左边界
                        blocks_pos.set(p_index,
                                new Integer[] { i - 200, be[1] });// 需要扩展左边界
                        blocks.set(p_index, htmls.substring(i - 200, be[1]));// 需要扩展左边界
                        break;
                    } else if ((i + 200) < be[0]) { // 若当前匹配位置右边界小于当前位置左边界，说明当前匹配与之前匹配完全没有交叉
                        blocks_pos.add(p_index, new Integer[] { i - 200,
                                i + 200 });// 插入数字在当前位置
                        blocks.add(p_index, htmls.substring(i - 200, (i + 200) > htmlLen ? htmlLen : (i + 200)));// 插入内容在当前位置
                        break;
                    }
                    if (blocks_pos.indexOf(be) == (blocks_pos.size() - 1)) {// 若运行到最后一个，说明当前匹配位置大于之前所有位置
                        blocks_pos.add(new Integer[] { i - 200, (i + 200) > htmlLen ? htmlLen : (i + 200) });// 插入数字在最后
                        blocks.add(htmls.substring(i - 200, (i + 200) > htmlLen ? htmlLen : (i + 200)));// 插入内容在最后
                        break;
                    }
                }
 
                if (blocks_pos.size() == 0) { // 第一个需要直接录入
                    blocks_pos.add(new Integer[] { i - 200, (i + 200) > htmlLen ? htmlLen : (i + 200) });// 插入数字在最后
                    blocks.add(htmls.substring(i - 200, (i + 200) > htmlLen ? htmlLen : (i + 200)));// 插入内容在最后
                }
            }
 
            // 2.过滤不符合标准
//            blocks_tmp.addAll(blocks);
//            for (String b : blocks_tmp) {
//                if (b.indexOf(">", 200) < b.indexOf("<", 200) // 在标签中
//                        || b.indexOf("<", 200) == b.indexOf("</a>", 200) // 在 A 标签中
//                        || b.replaceAll("<[^>]*?>", "").length() < 50) {
//                    blocks.remove(b); // 错误！！此处应当判断blocks当中是否还有其他关键词匹配，若无则删除blocks 若有则只去除关键词而保留内容
//                }
//            }
        }
 
        StringBuffer sb=new StringBuffer();
        for (String b : blocks) {
            sb.append(("<" + b + ">").replaceAll("<[^>]*?>", ""));
        }
        return sb.toString();
    }
 
}